home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 561 / prolog / anhang.doc (.txt) < prev    next >
ST Writer Document  |  1991-09-08  |  17KB  |  423 lines

  1. Do Run Run STWRITER.PRG
  2. Anhang
  3. zur Dokumentation von TOY Prolog ST, Version 3
  4. Inhalt
  5. A.1  Aufbau des Interpreters
  6. A.2  Syntax des inneren Interpreters
  7. A.3  Die Systemdatei
  8. A.4  Die Implementierung der Benutzerschnittstelle
  9. A.5  Erweiterungen  in der vorliegenden Version von TOY Prolog  ST 
  10.      in Bezug auf die Dokumentation.
  11.      A.1 Der Aufbau des Interpreters
  12. TOY  Prolog besteht aus zwei Teilen,  dem inneren und dem  
  13. eren 
  14. Interpreter.  Der  innere Interpreter ist in C und 68000-Assembler 
  15. geschrieben,  der 
  16. ere bereits in Prolog selbst.  Der Vorteil an 
  17. einer   derartigen  Implementierung  ist,   da
  18.   viele  Teile  des 
  19. Interpreters in Prolog erheblich leichter zu formulieren sind  als 
  20. in anderen Programmiersprachen.
  21. Ein Beispiel daf
  22. r ist das Pr
  23. dikat 'repeat'.  In Prolog ist es wie 
  24. folgt definiert :
  25.      repeat.
  26.      repeat :- repeat.
  27. Eine  Implementierung  von  'repeat' in  C  w
  28. rde  erfordern,  die 
  29. Datenstrukturen,   die  der  innere  Interpreter   verwendet,   zu 
  30. erweitern; der entstehende Mehraufwand w
  31. re betr
  32. chtlich.
  33. Die  verwendete Technik hat nat
  34. rlich auch Nachteile.  Der  gr
  35. davon  ist  zweifelsohne der der geringeren  Geschwindigkeit.  Der 
  36. gesamte   Parser  von  TOY  Prolog  ist  im  
  37. eren   Interpreter 
  38. implementiert,  und aufgrund der komplexen Syntax (TOY Prolog soll 
  39. weitgehend  mit  Prolog-10 kompatibel sein) ist  der  Parser  sehr 
  40. aufwendig.  Man  merkt das besonders schmerzlich beim Einlesen von 
  41. Dateien mit 'consult' etc.
  42. Die geringe Geschwindigkeit beim Einlesen von Programmen kann  man 
  43. auf eine einfache Weise umgehen. Sobald man ein korrektes Programm 
  44. vorliegen hat,  kann man es in die Syntax des inneren Interpreters 
  45. bersetzen.  Die Geschwindigkeit,  mit der derartige Zwischencodes 
  46. eingelesen  werden,  
  47. bertrifft bei weitem die Lesegeschwindigkeit 
  48. eren Interpreters.
  49. Der   
  50. ere  Interpreter  besteht  im  wesentlichen   aus   einer 
  51. Programmschleife (loop / 0), die Terme mit 'read' einliest und sie 
  52. auswertet. Diese Schleife kann auch aus Benutzerprogrammen mit
  53.      tag(loop)
  54. aufgerufen werden; sie wird durch das Pr
  55. dikat 'stop' abgebrochen. 
  56. Diese M
  57. glichkeit wird z.B. im Editor verwendet.
  58. Die  Art  und Weise der Implementierung verlangt,  da
  59.  der  
  60. Interpreter  nach dem Programmstart eingelesen wird.  Deshalb gibt 
  61. es  in  TOY  Prolog eine  Systemdatei  namens  'SYSFILE.TOY'.  Sie 
  62. lt  au
  63. er  dem  Zwischencode des  
  64. eren  Interpreters  noch 
  65. andere  wichtige Daten,  insbesondere die Namen und  Stelligkeiten 
  66. der  Systemfunktionen  und  die  Definitionen  der  vordefinierten 
  67. dikate.  Der  Aufbau  der  Systemdatei wird  in  Abschnitt  A.3 
  68. utert.
  69.      A.2 Die Syntax des inneren Interpreters
  70. Die Syntaxbeschreibung erfolgt analog zur Beschreibung der  vollen 
  71. Syntax in Abschnitt II.
  72. Klausel             ::=  Regel | Ziel
  73. Regel               ::=  F_Term : Aufrufliste
  74. Ziel                ::=  : Aufrufliste #
  75. Aufrufliste         ::=  { Aufruf . } []
  76. Aufruf              ::=  F_Term
  77. F_Term              ::=  Funktor | Funktor ( Argumente )
  78. Funktor             ::=  Name | Q_Name | [] | !
  79. Argumente           ::=  Term { , Term }
  80. Term                ::=  (  Term  ) | Variable | Zahl |  F_Term  | 
  81.                          Term . Term
  82. Variable            ::=  Anonyme_Variable | Numerierte_Variable
  83. Anonyme_Variable    ::=  _
  84. Numerierte_Variable ::=  : Zahl
  85. Zahl                ::=  Vorzeichen Ziffer { Ziffer }
  86. Name                ::=  Kleinbuchstabe { Alphanumerisch }
  87. Q_Name              ::=  ' Q_Zeichen { Q_Zeichen } '
  88. Q_Zeichen           ::=  '' | Nicht_'
  89. *** Nicht_' ist jedes Zeichen au
  90. Alphanumerisch      ::=  Kleinbuchstabe | Gro
  91. buchstabe |
  92.                          Ziffer | _
  93. Vorzeichen          ::=  + | | -
  94. *** Das Vorzeichen kann auch fehlen.
  95. *** Kleinbuchstabe, Gro
  96. buchstabe, Ziffer siehe Abschnitt II.
  97. uterungen
  98. (1)  Der innere Interpreter liest nur Regeln und Ziele ein,  wobei 
  99.      ein Ziel syntaktisch eine Regel ohne Kopf ist.  Fakten m
  100. ssen 
  101.      als  Regeln repr
  102. sentiert werden,  bei denen die  Aufrufliste 
  103.      gleich  [] ist.  Ein Ziel wird durch das Zeichen '#' beendet, 
  104.      das  dem Interpreter mitteilt,  da
  105.  er mit der Auswertung des 
  106.      Ziels (d.h.  mit dem Versuch,  das Ziel zu erf
  107. llen) beginnen 
  108.      soll.  Es  wird keine Meldung 
  109. ber Gelingen oder Fehlschlagen 
  110.      des Ziels ausgegeben.
  111. (2)  Soll  der innere Interpreter vom Datenstrom 'user' lesen,  so 
  112.      verh
  113. lt er sich, als habe er das Ziel
  114.           : ear . [] #
  115.      eingelesen.   Dieses   Ziel   ist  der  Aufruf  des   
  116. eren 
  117.      Interpreters  und mu
  118.  daher als Pr
  119. dikat vorhanden sein;  f
  120.      den  Fall,   da
  121.   ein  anderes  Pr
  122. dikat  als  'ear'  in  der 
  123.      Systemdatei  (siehe  Abschnitt A.3) eingetragen  wurde,  gilt 
  124.      sinngem
  125.  dasselbe.
  126. (3)  Anonyme  Variablen,  die  der  innere  Interpreter  einliest, 
  127.      verhalten sich anders als anonyme Variablen,  die vom 
  128. eren 
  129.      Interpreter eingelesen werden. Der innere Interpreter erzeugt 
  130.      'echte' anonyme Variablen,  die nicht mit Werten instantiiert 
  131.      werden  k
  132. nnen.  Der 
  133. ere Interpreter erzeugt statt  dessen 
  134.      einmalige Instanzen von 'normalen' Variablen. Der Unterschied 
  135.      ist  normalerweise bedeutungslos;  man sollte sich aber nicht 
  136.      darauf  verlassen,   da
  137.   z.B.   'numbervars'  wirklich  alle 
  138.      Variablen instantiiert.
  139. (4)  Beim Einlesen von 'numerierten' Variablen erzeugt der  innere 
  140.      Interpreter eine Tabelle,  anhand derer er erkennt,  wieviele 
  141.      verschiedene Variablen ein Term enth
  142. lt. Der Term
  143.           f( :1, :100)
  144.      erfordert also nicht 100,  sondern nur 2 Variablen. Die einer 
  145.      Variablen  bei der Eingabe zugeordnete Nummer hat nichts  mit 
  146.      der  von 'display' oder 'write' ausgegebenen  Variablennummer 
  147.      zu  tun;  'display'  benutzt die interne  Repr
  148. sentation  von 
  149.      Variablen, 'write' deren Reihenfolge im Term.
  150.      A.3 Die Systemdatei
  151. Die Systemdatei 'SYSFILE.TOY' besteht aus drei Teilen :
  152. -    den  Namen  und Stelligkeiten bestimmter Funktoren,  die  vom 
  153.      inneren  Interpreter f
  154. r besondere Aufgaben ben
  155. tigt  werden. 
  156.      Es  sind  ';' und ',' (ben
  157. tigt f
  158. r die  Implementierung  des 
  159.      'cut'),  'tag'  und  'call',  '[]' und '.',  'error' (f
  160. r die 
  161.      Behandlung von Aufruffehlern), 'user' (f
  162. r die Ein-/Ausgabe), 
  163.      die  Operatortypen  und  'ear' (das  Ziel,  das  vom  inneren 
  164.      Interpreter aufgerufen wird).
  165.      Die  Beschreibungen dieser Funktoren sollten nicht  ver
  166. ndert 
  167.      werden;  ausgenommen  davon  ist 'ear',  das ge
  168. ndert  werden 
  169.      kann,  um  ein  anderes  Ziel  vom  inneren  Interpreter  aus 
  170.      aufrufen zu lassen.
  171. -    den  Namen und Stelligkeiten der Systemfunktionen.  Die Namen 
  172.      der  Systemfunktionen k
  173. nnen beliebig ge
  174. ndert  werden,  aber 
  175.      die  Stelligkeiten  m
  176. ssen erhalten bleiben.  Wird  der  Name 
  177.      einer  Systemfunktion ge
  178. ndert,  so mu
  179.  die 
  180. nderung in allen 
  181.      Programmen, insbesondere im 
  182. eren Interpreter, durchgef
  183.      werden;  andernfalls  sind  Programme,  die  die  betreffende 
  184.      Funktion benutzen, nicht mehr lauff
  185. hig !
  186. -    der  Systembibliothek.  Diese  enth
  187. lt  (in  der  Syntax  des 
  188.      inneren  Interpreters)  die Definitionen  der  vordefinierten 
  189.      Pr
  190. dikate und den Zwischencode des 
  191. eren Interpreters. Auch 
  192.      hier  gilt f
  193. r Namens
  194. nderungen das oben gesagte;  
  195. nderungen 
  196.      der  Definitionen haben nicht so weitreichende  Folgen,  aber 
  197.      sie    k
  198. nnen   durchaus   dazu   f
  199. hren,    da
  200.     Programme 
  201.      (einschlie
  202. lich  der  Hilfsprogramme)  nicht  mehr  lauff
  203.      sind.  Zu  Ver
  204. nderungen an der Benutzerschnittstelle wird im 
  205.      Abschnitt A.4 noch n
  206. heres gesagt.
  207. Die  Beschreibungen  der  Spezialfunktoren  und   Systemfunktionen 
  208. werden zur Initialisierung des inneren Interpreters verwendet; sie 
  209. werden eingelesen,  nachdem AES,  VDI und die Speicherbereiche des 
  210. Interpreters initialisiert wurden.
  211. Die  Systembibliothek  wird direkt nach  der  Initialisierung  des 
  212. inneren Interpreters eingelesen; am Dateiende steht ein 'seen', so 
  213.  nach dem Einlesen der 
  214. ere Interpreter gestartet wird.
  215.      A.4 Die Implementierung der Benutzerschnittstelle
  216. Die  Syntax des inneren Interpreters ist zwar sehr einfach,  daf
  217. sind  Programme  in  dieser  Form  nur  schwer  verst
  218. ndlich;  ein 
  219. Programm von der Gr
  220. enordnung des 
  221. eren Interpreters kann daher 
  222. nicht direkt im Zwischencode entwickelt werden.
  223. Aus   diesem  Grund  wurde  die  Benutzerschnittstelle  in   einer 
  224. Untermenge  der  zu implementierenden Sprache  geschrieben.  Diese 
  225. "Halbsprache" ist in folgenden Punkten gegen
  226. ber der vollst
  227. ndigen 
  228. Syntax eingeschr
  229. -    Operatornotation und die Verwendung von grammatischen  Regeln 
  230.      ist nicht erlaubt.
  231. -    Die  Listennotation ist leicht eingeschr
  232. nkt :  In einem Term 
  233.      der Form
  234.           [ A, B, C ... | X ]
  235.      mu
  236.  X eine Variable sein.
  237. -    Das  Komma  in  einer Regel und das Symbol  ':-'  werden  als 
  238.      Trennzeichen  (nicht als Operatoren) behandelt.  ';' darf  in 
  239.      einer  Regel  nicht als Trennzeichen,  wohl aber als  Funktor 
  240.      verwendet werden.
  241. Das Hilfsprogramm 'BOOTER.TOY' kann diese Notation praktisch 1 : 1 
  242. in den Zwischencode 
  243. bersetzen.
  244. Der Quellcode der Benutzerschnittstelle befindet sich in der Datei 
  245. 'MONITOR.PRO';   nach   der   
  246. bersetzung  sollte  man   aus   dem 
  247. entstandenen  Zwischencode  alle Kommentare  entfernen,  da  diese 
  248. ziemlich viel Platz verbrauchen. Dabei ist zu beachten, da
  249.  manche 
  250. dikate,   die   Kommentare  erkennen  oder  erzeugen  (in   der 
  251. vorliegenden   Version   sind   es   'skip',   'absorbtoken'   und 
  252. 'nextline'), das Zeichen '%' benutzen; man darf also nicht einfach 
  253. alle Zeilen l
  254. schen, in denen '%' vorkommt.
  255. ber  die  Verfahren,  die beim Entwurf des  
  256. eren  Interpreters 
  257. angewandt wurden,  und 
  258. ber dessen Aufbau, kann hier nichts gesagt 
  259. werden;  eine ausf
  260. hrliche Beschreibung findet sich in "Prolog for 
  261. Programmers".
  262.      A.5 Unterschiede zur Dokumentation
  263. In  der vorliegenden Version 3.3 gibt es folgende Unterschiede  zu 
  264. dieser Dokumentation:
  265. -    Die  Bet
  266. tigung  der  Tasten 'Control' 'C'  f
  267. hrt  in  vielen 
  268.      F
  269. llen zum sofortigen Abbruch des 
  270. eren  Interpreters.  Das 
  271.      Programm verh
  272. lt sich so, als ob nach einer Unterbrechung mit 
  273.      'Shift'  'Alternate'  'Help' die Option A  (Abbruch)  gew
  274.      wurde.
  275.      Der  innere Interpreter wird nicht abgebrochen;  wird  gerade 
  276.      keine Datei eingelesen, so wird der 
  277. ere Interpreter wieder 
  278.      gestartet.
  279. -    Falls  bei  einer Diskettenoperation  ein  kritischer  Fehler 
  280.      (Wechsel  der  Diskette,  falsche Diskette im Laufwerk  etc.) 
  281.      auftritt, erfolgt die Meldung:
  282.      There was a critical error. (A)bort, (R)etry or (I)gnore ?
  283.      Die   Eingabe   von  'A'  f
  284. hrt  zum   Abbruch   (mit   einer 
  285.      Fehlermeldung);  'R'  veranla
  286. t einen neuen Versuch,  und bei 
  287.      'I' wird der Fehler ignoriert (Vorsicht !).
  288. -    Die  Anzeige  der Teilziele  im  Testmodus  ("CALL",  "REDO", 
  289.      "EXIT",  "FAIL")  funktioniert (noch) nicht  richtig.  "FAIL" 
  290.      wird  bei  jedem  Mi
  291. erfolg,   auch  vor  einem  'backtrack', 
  292.      angezeigt,   nicht  nur  (wie  es  richtig  w
  293. re)  nach   dem 
  294.      endg
  295. ltigen Fehlschlag des Teilzieles. Im Gegensatz dazu wird 
  296.      "EXIT"   nicht   bei  allen  erfolgreich   erf
  297. llten   Zielen 
  298.      angezeigt.
  299.      Es  ist zweifelhaft,  ob diese Mi
  300. nde noch behoben  werden 
  301.      (k
  302. nnen   ?).   Der  "FAIL"-Fehler  ist   beim   Programmtest 
  303.      hinderlich und wird wahrscheinlich noch ausgemerzt,  aber der 
  304.      "EXIT"-Fehler   ist  teilweise  durch  die   optimierte   (!) 
  305.      Ausf
  306. hrung  von  rekursiven  Pr
  307. dikaten bedingt  und  kann  - 
  308.      zumindest in dieser Situation - nicht verhindert werden.
  309.      (TOY  Prolog f
  310. hrt eine 'tail recursion  optimisation'  (TRO) 
  311.      durch,  d.h.,  da
  312.   die 'activation records'  von  Pr
  313. dikaten 
  314.      zerst
  315. rt werden k
  316. nnen,  falls dadurch Speicher gespart wird. 
  317.      Der  Name  kommt von rekursiven  Pr
  318. dikaten,  bei  denen  der 
  319.      rekursive Aufruf der letzte in seiner Klausel ist; allerdings 
  320.      erstreckt sich die TRO auch auf andere Situationen,  wie z.B. 
  321.      den 'cut')
  322. -    Es  wurden drei weitere Systemfunktionen  implementiert,  die 
  323.      auf die Dateiverzeichnisse des Betriebssystems zugreifen :
  324. disk_dir (VAR)
  325.      instantiiert    PAR_1   mit   dem   Namen    des    aktuellen 
  326.      Dateiverzeichnisses,  d.h.  mit der Laufwerksbezeichnung  und 
  327.      dem Pfadnamen.
  328. disk_dir (NAME)
  329.      macht   das  durch  PAR_1  angegebene  Dateiverzeichnis   zum 
  330.      aktuellen  Dateiverzeichnis.  Die  Laufwerksbezeichnung  kann 
  331.      fehlen;  in  diesem Fall wird das aktuelle Laufwerk  benutzt. 
  332.      Ist PAR_1 fehlerhaft, so wird ein Systemaufruffehler erzeugt.
  333. disk_search (NAME, INTEGER, TERM, TERM)
  334.      PAR_1  und PAR_2 sind Parameter f
  335. r den  Betriebssystemaufruf 
  336.      F_SFIRST  :  Es  wird  nach der  ersten  Datei  im  aktuellen 
  337.      Dateiverzeichnis (oder in einem Verzeichnis,  das durch einen 
  338.      in  PAR_1 vorhandenen Pfadnamen bestimmt wird)  gesucht,  die 
  339.      dem Suchmuster in PAR_1 entspricht,  und deren Attribute  dem 
  340.      Suchattribut PAR_2 entsprechen.  Das Suchmuster wird wie  ein 
  341.      Dateiname angegeben;  allerdings k
  342. nnen hier die 'wild cards' 
  343.      *  und  ?  benutzt werden.  Im Pfadnamen d
  344. rfen  keine  'wild 
  345.      cards' stehen.
  346.      Die  Suchattribute  werden in PAR_2  bitweise  angegeben;  im 
  347.      einzelnen bedeutet
  348.           0    Normaler Dateizugriff m
  349. glich
  350.           1    Datei ist schreibgesch
  351.           2    Datei ist 'versteckt'
  352.           4    Datei ist 'Systemdatei' (ebenfalls versteckt)
  353.           8    keine Datei, sondern der Name der Diskette
  354.           16   keine Datei, sondern Dateiverzeichnis
  355.           32   Datei wurde beschrieben und geschlossen (???)
  356.      Falls keine entsprechende Datei gefunden wurde,  schl
  357. gt  der 
  358.      Aufruf fehl; ansonsten wird versucht, PAR_3 mit dem Namen und 
  359.      PAR_4 mit den Attributen der gefundenen Datei zu unifizieren.
  360. disk_search (TERM, TERM)
  361.      sucht  nach der n
  362. chsten Datei,  deren Name und Attribute  zu 
  363.      den   im   letzten  Aufruf  von   disk_search/4   angegebenen 
  364.      Suchmustern passen,  und versucht,  PAR_3 mit dem  Dateinamen 
  365.      und  PAR_4  mit den zugeh
  366. rigen  Attributen  zu  unifizieren. 
  367.      Falls  keine passende Datei mehr gefunden wird,  schl
  368. gt  der 
  369.      Aufruf fehl.
  370. -    Die Eingabe von der Tastatur (Datenstr
  371. me 'user' und 'keybd') 
  372.      wurde ver
  373. ndert.  Insbesondere werden die Funktionstasten (F1 
  374.      bis F10 und der Cursorblock) jetzt ausgenutzt.
  375.      Es   besteht  die  M
  376. glichkeit,   die   Funktionstasten   mit 
  377.      Zeichenketten   zu   belegen,    die   beim   Bet
  378. tigen   der 
  379.      entsprechenden Tasten so interpretiert werden, als ob sie von 
  380.      der Tastatur aus eingegeben wurden.
  381.      Dazu dient die neue Systemfunktion
  382. set_fstring (INTEGER, NAME).
  383.      PAR_1 mu
  384.  eine Integerzahl aus dem Bereich von 0 bis 27 sein, 
  385.      die  die  gew
  386. nschte  Funktionstaste  ausw
  387. hlt  (s.u.).   Die 
  388.      ausgew
  389. hlte   Funktionstaste  wird  mit  einer   Zeichenkette 
  390.      belegt,  die durch den Namen von PAR_2 gegeben ist (PAR_2 mu
  391.      ein Funktor ohne Argumente sein).
  392.      Die Funktionstasten sind wie folgt gekennzeichnet:
  393.           0  F1          10  Shift/F1        20  Clr/Home
  394.           1  F2          11  Shift/F2        21  Cursor hoch
  395.           2  F3          12  Shift/F3        22  Cursor links
  396.           3  F4          13  Shift/F4        23  Cursor rechts
  397.           4  F5          14  Shift/F5        24  Cursor runter
  398.           5  F6          15  Shift/F6        25  Insert
  399.           6  F7          16  Shift/F7        26  Undo
  400.           7  F8          17  Shift/F8        27  Help
  401.           8  F9          18  Shift/F9
  402.           9  F10         19  Shift/F10
  403.      F
  404. r die Zeichenkette gilt noch folgende Besonderheit :
  405.       Steht in der Zeichenkette ein '\',  so wird das nachfolgende 
  406.      Zeichen  so  interpretiert,  als ob die  entsprechende  Taste 
  407.      zusammen mit 'Control' gedr
  408. ckt worden w
  409.      Ausnahme :  Ist das folgende Zeichen wieder ein '\',  so gilt 
  410.      es (wie 
  411. blich) als ein einzelnes '\'.
  412.      Beispiele : \G - 'Bell', \H - 'Backspace',  \M - 'Return'.
  413. Geplante 
  414. nderungen :
  415. -    Fehler im Testmodus, siehe oben.
  416. -    Einbindung  von Programmen aus anderen Sprachen  (C,  Pascal, 
  417.      Assembler).
  418.      (Falls ich jemals dazu komme,  mir daf
  419. r einen Grund und eine 
  420.      Vorgehensweise zu 
  421. berlegen ...)
  422.      Ende des Anhangs zur Dokumentation von TOY Prolog ST, Version 3
  423.